/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

import { map } from 'rxjs';
import { Logger } from './logger';

/**
 * Keep an map of indentation => array of indentations based on the level.
 * This is to optimize calculating the prefix based on the indentation itself. Since most logs
 * come from similar levels, and with similar indentation strings, this will be shared by all
 * loggers. Also, string concatenation is expensive so performing concats for every log entries
 * is expensive; this alleviates it.
 */
const indentationMap: { [indentationType: string]: string[] } = {};

export class IndentLogger extends Logger {
  constructor(name: string, parent: Logger | null = null, indentation = '  ') {
    super(name, parent);

    indentationMap[indentation] = indentationMap[indentation] || [''];
    const indentMap = indentationMap[indentation];

    this._observable = this._observable.pipe(
      map((entry) => {
        const l = entry.path.filter((x) => !!x).length;
        if (l >= indentMap.length) {
          let current = indentMap[indentMap.length - 1];
          while (l >= indentMap.length) {
            current += indentation;
            indentMap.push(current);
          }
        }

        entry.message = indentMap[l] + entry.message.split(/\n/).join('\n' + indentMap[l]);

        return entry;
      }),
    );
  }
}
